package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2024-01-26
 * Time: 10:23
 */

// 这是一个回显程序 ： 差不多就是 请求是什么，响应就是什么

// 服务器
    // 先打开服务器，再打开客户端

public class UDPServer {
    private DatagramSocket socket = null;
    // 咱们这里的socket没有手动的close，   也是因为 这个socket 对象的生命周期就是在这个start方法中的while循环中的
    // 出了这个while循环，这个socket对象就不能用了，也意味着 start方法的结束，main方法的结束，那么这个进程也就结束了。
    // 进程结束了，那这个进程的文件资源也就都释放了，所以此处的使用就不需要手动的使用 close 方法
    // 不怕这种生命周期长的 socket， 怕的是被频繁创建的 socket

    // 构造方法
    // 服务器 这端 需要指定端口号（为了让客户端能找到服务器的位置）
    public UDPServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动： ");
        while(true){
            // 接收请求的
            DatagramPacket requestpacket = new DatagramPacket(new byte[4096],4096);
            // 服务器接收 客户端发来的请求请求
            // 当客户端没有发来请求的时候，这里的接收操作会阻塞等待
            socket.receive(requestpacket);

            // 为了方便显示观察，（这一步转换不是必要的）
            // 把接收到的请求 转为字符串
            String request = new String(requestpacket.getData(),0, requestpacket.getLength());

            // process 是对请求进行处理然后返回 对这个请求的响应字符串
            String response = process(request);

            // 把产生的响应从字符串变成 DatagramPacket 类型
            DatagramPacket responsepacket = new DatagramPacket(response.getBytes(StandardCharsets.UTF_8),response.getBytes().length,
                    requestpacket.getSocketAddress());

            // 服务器发送 响应 给客户端
            socket.send(responsepacket);

            // 打印日志，观看请求响应的过程结果
            System.out.printf("[%s:%d] req: %s, resp: %s\n", requestpacket.getAddress().toString(),
                    requestpacket.getPort(), request, response);


        }
    }

    // process 是对请求进行处理然后返回 对这个请求的响应字符串
    // 这个是一个回显程序的示例，这里的 process方法，就是  请求是什么，响应就是什么
    public String process(String request) {
        return request;
    }

    // 主函数
    public static void main(String[] args) throws IOException {
        UDPServer server = new UDPServer(9090);
        server.start();
    }
}
